package br.uniceub.fsw.agenda.controller;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.model.vo.TipoLogradouroVO;
import br.uniceub.fsw.agenda.model.facade.ManterTipoLogradouroFacade;
import br.uniceub.fsw.agenda.util.HttpRequestWithModifiableParameters;
import br.uniceub.fsw.agenda.util.NumberUtils;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.io.*;
import java.net.*;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Bruno
 */
public class ManterTipoLogradouroController extends GenericServlet {
    private String nomeTela = "/manterTipoLogradouro/manterTipoLogradouro.jsp";
    public void iniciarTela(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //Facades
        ManterTipoLogradouroFacade facadeTipoLogradouro = new ManterTipoLogradouroFacade();
        
        try {
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeTipoLogradouro.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            //buscar lista de tipos de logradouro
            List<TipoLogradouroVO> listTipoLogradouro = facadeTipoLogradouro.findAllTipoLogradouro();
            request.setAttribute("listaDeTipoLogradouro", listTipoLogradouro);
        } catch (BusinessException ex) {          
            request.setAttribute("error", ex.getMessage());
        } catch (DatabaseException ex) {            
            request.setAttribute("error", "Erro de comunicação com o banco de dados.");
        }        
        RequestDispatcher rd = request.getRequestDispatcher(nomeTela);
        rd.forward(request, response);        
    }   
    
    public void listar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //pegar parametros da tela
        String dsTipoLogradouro = request.getParameter("dsTipoLogradouro");

        //Facades
        ManterTipoLogradouroFacade facadeTipoLogradouro = new ManterTipoLogradouroFacade();
        
        
        try {
            
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeTipoLogradouro.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            List<TipoLogradouroVO> listaTipoLogradouro = null;
            listaTipoLogradouro = facadeTipoLogradouro.findAllTipoLogradouro(dsTipoLogradouro);
            
            request.setAttribute("listaDeTipoLogradouro", listaTipoLogradouro);
            
        } catch (BusinessException ex) {
            request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
            request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }

        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        wrapper.setParameter("idTipoLogradouro", "");
        wrapper.setParameter("dsTipoLogradouro", "");
        
        iniciarTela(wrapper, response);        
    }
    
    public void inserir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idTipoLogradouro = NumberUtils.toInteger(request.getParameter("idTipoLogradouro"));
        String dsTipoLogradouro = request.getParameter("dsTipoLogradouro");
        
        //facade
        ManterTipoLogradouroFacade facade = new ManterTipoLogradouroFacade();
        
        //montar entidade que sera gravada
        TipoLogradouroVO tipoLogradouro = new TipoLogradouroVO();
        tipoLogradouro.setIdTipoLogradouro(idTipoLogradouro);
        tipoLogradouro.setDsTipoLogradouro(dsTipoLogradouro);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            facade.inserirTipoLogradouro(tipoLogradouro);
                        
            wrapper.setParameter("idTipoLogradouro", "");
            wrapper.setParameter("dsTipoLogradouro", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void alterar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idTipoLogradouro = NumberUtils.toInteger(request.getParameter("idTipoLogradouro"));
        String dsTipoLogradouro = request.getParameter("dsTipoLogradouro");
        
        //facade
        ManterTipoLogradouroFacade facade = new ManterTipoLogradouroFacade();
        
        //montar entidade que sera atualizada
        TipoLogradouroVO tipoLogradouro = new TipoLogradouroVO();
        tipoLogradouro.setIdTipoLogradouro(idTipoLogradouro);
        tipoLogradouro.setDsTipoLogradouro(dsTipoLogradouro);
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            facade.alterarTipoLogradouro(tipoLogradouro);
                        
            wrapper.setParameter("idTipoLogradouro", "");
            wrapper.setParameter("dsTipoLogradouro", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

    public void consultar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idTipoLogradouro = NumberUtils.toInteger(request.getParameter("idTipoLogradouro"));
        
        //facade
        ManterTipoLogradouroFacade facadeTipoLogradouro = new ManterTipoLogradouroFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);

        try {
            //buscar lista de menus
            List<MenuVO> listaMenu = facadeTipoLogradouro.findAllMenu();
            request.setAttribute("listaDeMenu", listaMenu);

            //montar entidade que sera apagada
            TipoLogradouroVO tipoLogradouro = facadeTipoLogradouro.findTipoLogradouroById(idTipoLogradouro);

            if(tipoLogradouro.getIdTipoLogradouro() != null) {
                wrapper.setParameter("idTipoLogradouro", tipoLogradouro.getIdTipoLogradouro().toString());
            }
            wrapper.setParameter("dsTipoLogradouro", tipoLogradouro.getDsTipoLogradouro());
            
            List<TipoLogradouroVO> listaTipoLogradouro = new ArrayList<TipoLogradouroVO>();
            listaTipoLogradouro.add(tipoLogradouro);
            
            request.setAttribute("listaDeTipoLogradouro", listaTipoLogradouro);
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);        
    }

    public void excluir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //pegar parametros da tela
        Integer idTipoLogradouro = NumberUtils.toInteger(request.getParameter("idTipoLogradouro"));
        
        //facade
        ManterTipoLogradouroFacade facadeTipoLogradouro = new ManterTipoLogradouroFacade();
        
        //passar um wrapper no lugar do verdadeiro request para alterar valores
        HttpRequestWithModifiableParameters wrapper = new HttpRequestWithModifiableParameters(request);
        
        try {
            //montar entidade que sera apagada
            TipoLogradouroVO tipoLogradouro = new TipoLogradouroVO();
                    
            tipoLogradouro.setIdTipoLogradouro(idTipoLogradouro);
        
            facadeTipoLogradouro.excluirTipoLogradouro(tipoLogradouro);
                        
            wrapper.setParameter("idTipoLogradouro", "");
            wrapper.setParameter("dsTipoLogradouro", "");
        } catch (BusinessException ex) {
             request.setAttribute("mensagem", ex.getMessage());
        } catch (DatabaseException ex) {
             request.setAttribute("mensagem", "Erro de comunicação com o banco de dados.");
        }        
        
        iniciarTela(wrapper, response);
    }

}
